﻿:-op(200, fy, 'not').

/*************
 * F A C T S *
 *************/

fact(X; Y, CF):-
	!, fact(X, CF1), fact(Y, CF2), max(CF1, CF2, CF).
fact(X, CF):-
	X, CF is 1;
	\+X, X \= av(_, _), CF is -1.
	
/*****************
 * A S K A B L E *
 *****************/

askable(name, 'Tên bạn là gì?').
askable(birthYear, 'Bạn sinh năm nào?').
askable(gender, 'Giới tính của bạn?').
askable(weight, 'Bạn bao nhiêu cân?').
askable(height, 'Bạn cao bao nhiêu centimet?').

askable(like_taste(sweet), 'Bạn thích ăn ngọt không?').
askable(like_taste(sour), 'Bạn thích ăn chua không?').
askable(like_taste(hot), 'Bạn thích ăn cay không?').
askable(like_taste(salty), 'Bạn thích ăn mặn không?').



askable(isNormalMeal, 'Bạn muốn một bữa ăn thông thường?').
askable(mealTime, 'Bạn muốn chọn món ăn cho buổi nào?').

askable(like_ingredient(thit_bo), 'Bạn thích các món làm từ thịt bò không?').
askable(like_ingredient(thit_heo), 'Bạn thích các món làm từ thịt lợn không?').
askable(like_ingredient(thit_ga), 'Bạn thích các món làm từ thịt gà không?').

/* JOB ASKABLE */
askable(job,'Bạn làm nghề gì?').


/* DISEASE ASKABLE */

askable(still(ill), 'Bạn có còn bị ốm không?').
askable(still(flu), 'Bạn có còn bị cảm không?').
askable(still(toothache), 'Bạn có còn bị đau răng không?').
askable(still(acne), 'Bạn có còn bị mụn không?').
/*
askable(got_disease(stomachache), 'Bạn có bị đau dạ dày không').
askable(got_disease(diabetes), 'Bạn có bị tiểu đường không?').
askable(got_disease(gout), 'Bạn có bị thống phong (gout) không?').
askable(got_disease(osteoporosis),'Bạn có bị loãng xương không?').
askable(got_disease(heart_disease),'Bạn có bị bệnh tim mạch không?').
askable(got_disease(high_cholesteron),'Bạn có bị máu nhiễm mỡ').
*/
askable(isDisease, 'Bạn có đang bị bệnh không?').
askable(disease, 'Bạn đang bị những bệnh gì?').

askable(allergy, 'Bạn có dị ứng với những thức ăn gì?').

/* SPECIAL CASE ASKABLE */
askable(pregnant, 'Bạn có thai không?').
askable(has_baby, 'Bạn có phải cho con bú không?').

askable(play_sport, 'Bạn có tập thể thao cường độ cao không?').

/* DATE CASE ASKABLE */
askable(whichday, 'Bạn muốn chọn món ăn cho hôm nay, ngày mai, hay ngày kia?').

default(av(birthYear, Y), 0.1) :- date(Y-14, _, _, _, _, _, _, _, _). 
default(av(gender, male), 0.501).
default(av(weight, 50), 0.2).
default(av(height, 150), 0.2).

default(av(like_taste(sour), yes), 0.1).
default(av(like_taste(hot), yes), -0.2).
default(av(like_taste(salty), yes), 0.1).
default(av(like_taste(sweet), yes), 0.2).

default(av(isNormalMeal, yes), 0.1).

default(av(like_ingredient(thit_bo), yes), 0.5).
default(av(like_ingredient(thit_heo), yes), 0.2).
default(av(like_ingredient(thit_ga), yes), 0.6).

default(av(job, student), 0.5).
default(av(isDisease, yes), -0.2).
default(av(disease, []), -0.2).
default(av(allergy, []), 0.2).
default(av(play_sport, yes), -0.2).
default(av(pregnant, 0), -0.9).
default(av(has_baby, 0), -0.9).
default(av(whichday, today), 0.5).

/*************
 * R U L E S *
 *************/

rule(
	'DEFAULT01',
	lhs([recipe(X), not av(group(X), special)]),
	rhs(av(like_recip(X), true), 0.3)
).

rule(	
	'DEFAULT02',
	lhs([recipe(X), av(group(X), special)]),
	rhs(av(like_recipe(X), true), 0.2)
).

:-[knowledge_age, knowledge_like_datetime_special, knowledge_health, knowledge_job, knowledge_weather].

/*************************
 * C H O O S E   M E A L *
 *************************/

like((X, CF)):-
	recipe(X), findgoal(av(like_recipe(X), true), CF).
like((X, CF), G):-
	recipe(X), findgoal(av(group(X), G), 1), findgoal(av(like_recipe(X), true), CF).

meals(Meal, CF):-
	findall((M, CFM), like((M, CFM), rice), L_Rice), mergesort(L_Rice, SL_Rice),
	log('finish rice'),
	findall((M, CFM), like((M, CFM), meat), L_Meat), mergesort(L_Meat, SL_Meat),
	log('finish meat'),
	findall((M, CFM), like((M, CFM), special), L_Special), mergesort(L_Special, SL_Special),
	log([L_Rice, L_Meat, L_Special]),
	meals2(Meal, CF, SL_Rice, SL_Meat, SL_Special).

meals2(Meal, CF, L_Rice, L_Meat, L_Special):-
	log('meals2_1'),
	L_Rice = [(X, CFX)|TX],
	L_Meat = [(Y, CFY)|TY],
	L_Special = [(Z, CFZ)|TZ],
	CFN is CFX * CFY,
	(
		CFN > CFZ -> Meal = [X, Y], CF is CFN;
		Meal = [Z], CF is CFZ
	).
meals2(Meal, CF, L_Rice, L_Meat, L_Special):-
	log('meals2_2'),
	L_Rice = [(X, CFX)|TX],
	L_Meat = [(Y, CFY)|TY],
	L_Special = [(Z, CFZ)|TZ],
	CFN is CFX * CFY,
	(
		CFN > CFZ ->
			(
				TX = [] -> findall((M, CFM), like((M, CFM), rice), NewL_Rice), mergesort(NewL_Rice, SL_Rice), meals2(Meal, CF, SL_Rice, TY, L_Special);
				meals2(Meal, CF, TX, TY, L_Special)
			);
		meals2(Meal, CF, L_Rice, L_Meat, TZ)
	).
